#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include <dialog_ui.h>
#include <QPushButton>

//对话框是 GUI 程序中不可或缺的组成部分。
//一些不适合在主窗口实现的功能组件可以设置在对话框中。
//对话框通常是一个顶层窗口，出现在程序最上层，用于实现短期任务或者简洁的用户交互。

//实际开发中，更多的情况，往往不是直接在创建项目的时候继承自QDialog.而是在代码中，创建额外的类，让额外的类继承自QDialog
//因为主窗口，一般不会作为一个对话框
//而是通过主窗口来产生其他的对话框

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QPushButton* pushButton = new QPushButton("打开对话框", this);
    pushButton->move(500, 500);

    connect(pushButton, &QPushButton::clicked, this, [=](){
    //通过代码生成dialog
    //注意,不同于界面上的其他控件.此处QDialog每次按下按钮，都会创建一个新的QDialog对象
    //并进行显示.每次点击都会创建新的对话框对象
    //一个程序运行过程中，可以无数次点击这个按钮，进一步的就产生出无数个这样的对象了,然后就造成了内存泄露
    Dialog* dialog = new Dialog(this);
    dialog->setWindowTitle("对话框");
    //设置对话框的尺寸
    dialog->resize(400, 300);
    //通过show方法就可以显示出对话框
    dialog->show();

    // delete dialog;
    // 正确做法应该是把delete和关闭按钮的点击信号关联起来
    // 在用户点击关闭的时候，触发 delete
    // Qt为了让咱们写的方便，直接给QDialog设置了一个属性，可以通过设置属性，完成上述效果
    // 只要给dialog设置下面的属性，此时就会在关闭的时候自动进行delete，Qt内置的功能
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

//通过图形化的方式创建对话框
void MainWindow::on_pushButton_clicked()
{
    //弹出一个自定义的对话框
    Dialog_ui* dialog_ui = new Dialog_ui(this);
    dialog_ui->setAttribute(Qt::WA_DeleteOnClose);
    //模态：弹出对话框的时候，此时用户无法操作父窗口.必须得完成对话框内部的操作，关闭对话框之后,才能对父窗口进行操作
    //用于特别关键的场合.用户必须要做出决策
    //非模态：弹出对话框的时候，用户可以操作父窗口
    //用于不是特别关键的场景
    //把show换成exec,就是非模态对模态的转变
    //dialog_ui->show();
    dialog_ui->exec();
}
